Julia - Vizuelizacija podataka - Prikaz statističkih rezultata

In [1]:
#U okviru programkog jezika Julia postoji veoma bogat skup funkcija za rad sa statističkim podacima i njihovu 
#vizuelizaciju. Osnovi rada za statistiku nalaze se u paketima Statistics i Distrubusions, koje ćemo ovde koristiti.
#Takođe, ovde ćemo koristiti i jedan od najznačajnijih formi za crtanje grafika u programskom jeziku Julia - GR
In [2]:
using Plots, Distributions, Statistics
In [3]:
gr()        #komanda sa kojom uvodimo GR
Out[3]:
Plots.GRBackend()
In [4]:
#U okviru paketa Distributions postoje već ugrađene funkcije za generisanje svih poznatih i široko primenljivih
#raspodela
In [5]:
#Prvo ćemo izvršiti generisanje normalne raspodele. Kreiranje objekta tipa Normal vrši se sa: Normal() - normalna raspodela, čiji je prvi argument srednja vrednost
#a drugi argument varijansa naše slučajne promenljive
x = Normal(0,1);
In [6]:
t = -5 : 0.01 : 5;
y = pdf.(x, t);   #pošto je prikaz objekta raspodele problematičan za funkciju plot, ona se npr. može vršiti
                 #estimacijom funkcije gustine verovatnoće tačka po tačka za vrednosti argumenta koje prosledimo
y = convert.(Float32, y);
In [7]:
plot(t,y, title = "Normalna raspodela, m=0, var = 1")
Out[7]:
In [8]:
x = Cauchy(0.5, 2);
t = -5 : 0.01 : 5;
y = pdf.(x, t); 
plot(t,y, title = "Košijeva raspodela, u=0.5, b = 2")
Out[8]:
In [9]:
#U praktičnim situacijama, mnogo češće nećemo imati "savršeno" generisane raspodele, već će podaci sa kojima radimo
#imati neka odstupanja od mogućnosti da njihova funkcija gustine verovatnoće bude savršeno analitički zapisana.
#Zbog toga, potrebno je i uvesti malo drugačiji pristup vizuelizaciji podataka u tom slučaju:

#Na primer:

x = randn(1000); #generišimo slučajnu promenljivu koja je Normalnog tipa - ona ima neku svoju srednju vrednost i 
                   #varijansu (podrazumevanu) koje ne znamo - ali to nas ne sprečava da iscrtamo njenu 
                   #funkciju gustine verovatnoće (do na faktor skaliranja)- to postižemo uz pomoć funkcije histogram()


#kao prvi argument prosleđujemo vektor koji sadrži odbirke naše slučajne promenljive, a kao
                  #drugi argument prosleđujemo broj korpica za čije intervale ćemo koliko su vrednosti iz tog intervala
                  #zastupljene
histogram(x, bins = 40)
Out[9]:
In [10]:
#Povećavanjem broja ovih korpica, dobićemo sve finiju i finiju raspodelu, te za broj korpica koji teži beskonačnosti
#naš histogram praktično teži funkciji gustine verovatnoće

histogram(x, bins = 100)
Out[10]:
In [11]:
histogram(x, bins = 200)             #još finiji prikaz histograma

#Faktor skaliranja koji nam je potreban da bi naš histogram vršio aproksimaciju funkcije gustine verovatnoće
#jeste 1/N, gde je N ukupan broj odbiraka naše slučajne promenljive
Out[11]:
In [12]:
#U slučaju kada imamo dvodimenzionalni slučajni vektor, a želkimo da vidimo kakvu raspodelu on ima - koristimo
#ugrađenu funkciju histogram2d

x = rand(2, 1000); #geerišemo slučajni vektor čije su promenljive normalno raspodeljenje
#Kako možemo dobiti njegovu združenu funkciju gustine verovatnoće?

#kao prvi argument prosleđujemo naš slučajni vektor - njegove komponente ponaosob
                            #a kao preostale argumente prosleđujemo broj korpica po jednoj promenljivoj, i po drugoj itd.
                            #ovde konkretno, ako prosledimo samo jedan broj, onda će se raditi podela po obe ose u taj
                            #broj korpica


histogram2d(x[1,:], x[2,:], nbins = 10)
Out[12]:
In [13]:
#Faktor skaliranja koji nam je potreban da bi naš histogram vršio aproksimaciju funkcije gustine verovatnoće
#jeste, slično kao i kod jednodimenzionog slučaja, 1/N, gde je N ukupan broj odbiraka našeg slučajnog vektora
In [14]:
#Konačno, za kraj, navešćemo još jednu vizuelizaciju za statističke podatke (koju smo već pominjali), u slučaju kada imamo višedimenzione
#slučajne promenljive - korelaciona matrica

x = randn(7,200); #generišimo sedmodimenzioni slučajni vektor - pošto je vizuelizacija njegove združene funkcije 
#gustine verovatnoće jako teška zbog svoje veće dimenzionalnosti, u tu svrhu se on opisuje svojim vektorom
#matematičkog očekivanja i momentima višeg reda,pa korelacionom matricom, koja
#nam daje informacije o korelisanosti među koordinatama ovog vektora

x = x';    #potrebno je izvršiti transponovanje matrice
R = cor(x);

#U velikom broju situacija nam je od praktičnog značaja da imamo uvid o korelisanosti između slučajnih promenljivih,
#a u praktičnim situacijama se najčešće koristi iscrtavanje ovih zavoisnosti preko heatmap-a:


heatmap(R, c=:thermal)
Out[14]:
In [ ]: